<?php
/**
 * Cdx 检查网址是否有重定向，并获得相关的数据
 *   
 * @author fosf
 * @copyright http://fosf.net
 * @version 1.0
 * @example
 *  $cdx= new Cdx($result);
 *  $arr=$cdx->iscdx('http://baidu.com');
 */
class Cdx {
//        private $result;
//        private $tmp;
//        private $arr;
          private $cdx = array();

	public function __construct() {

	}
    
//    error_reporting(E_ALL & ~ E_NOTICE);
//// 测试用的URL
//$urls = array(
//	"http://qq.com",
//	"http://sina.com/",
//	"http://baidu.com/",
//    "http://ipwww.cn/",
//	"http://outletscentre.com",
//);
////循环检查网址库
//foreach ($urls as $url) {
//    echo "URL: $url";
//    iscdx($url);
//	echo "<br/>";
//}

//检查是否存在重定向
public function checkheader($url,$ii=0){
    //echo $url;exit;
    
    
    
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);// 设置 url
		//curl_setopt($ch, CURLOPT_TIMEOUT,1000);//设置超时时间
        curl_setopt($ch, CURLOPT_NOBODY, 0);// 页面内容我们并不需要
		curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');//
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); // 302 redirect 是否抓取重定向后的页面
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_HEADER, 1);// 只需返回HTTP header
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// 返回结果，而不是输出它
        $output = curl_exec($ch);
		$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);//返回状态 如200,301,302,400
		//echo $status;
		//exit;
		//if($status > 306 || $status==0){
//		return 'err';
//		}
		$check['status']=$status;
        $check['output']=$output;
        curl_close($ch);
        return $check;
}

public function iscdx($url){
        $check=$this->checkheader($url);
		//echo $check['status'];exit;
        //echo $check['output'];
        // 有重定向的HTTP头信息吗？用正则获取。
		$isredirects=preg_match("!Location: http://(.*)/!", $check['output'], $matche);//如果提供了 matches，则其会被搜索的结果所填充。$matches[0] 将包含与整个模式匹配的文本，$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本，以此类推。 		
		//print_r($matche2);exit;
        if ($isredirects) {//如果有重定向，就不能直接获取到跳转后的信息，必须重取抓取新的地址获取信息
		$fh_cdx=$this->fh_cdx($check['output']);
        $cdx2['status']=$check['status'];
        $cdx2['url']=$url;
        $cdx2['title']=$fh_cdx['title'];
        $cdx2['description']=$fh_cdx['description'];
        $this->cdx[]=$cdx2;
        
            //echo iscdx($matche[1]);//就将重定向后的网址丢给cdx($url),单独获取信息 //$matche[1]是重定向后的网址
            $this->iscdx($matche[1],$i);
        } else {//没有重定向，就可以直接输出信息
		$fh_cdx=$this->fh_cdx($check['output']);
        $cdx2['status']=$check['status'];
        $cdx2['url']=$url;
        $cdx2['title']=$fh_cdx['title'];
        $cdx2['description']=$fh_cdx['description'];
        $this->cdx[]=$cdx2;
        
			$isrefresh=preg_match("!http-equiv=\"refresh\" content=\"(.*);url=http://(.*)/\"!", $check['output'], $matche2);
			if($isrefresh){//检查是否存在页面内的<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">跳转
				//echo iscdx($matche2[2]);//就将重定向后的网址丢给cdx($url),单独获取信息 //$matche[1]是重定向后的网址	
                $this->iscdx($matche2[2]); 		
			}
            
        }
        
	
	//return $cdx;
    //echo "11";
	//print_r($this->cdx);
    return $this->cdx;
}



//返回信息
public function fh_cdx($output){
$cdxarr=array();
$cdxarr['title']=$this->zz("#<title>(.*)</title>#iUs",$output);
$cdxarr['description']=$this->zz("#<meta name=\"description\" content=\"(.*)\" />#iUs",$output);
return $cdxarr;
}
//提取单条记录的通用正则
public function zz($preg,$con,$num=1){
preg_match($preg,$con,$arr);
return $arr[$num];
}

public function reTozc($str){
    
    $str=$str;
    //str_replace("world","John","Hello world!");
   $str=str_replace("+"," ",$str);
   $str=str_replace("%2C",",",$str);
   return $str; 
}

}
?>